package com.lab.service;

import com.lab.dto.WeeklyReportContentDTO;
import com.lab.dto.WeeklyReportDTO;
import com.lab.entity.WeeklyReport;
import com.lab.vo.WeeklyReportVO;

import java.util.List;

/**
 * 周报管理服务接口
 */
public interface WeeklyReportService {

    /**
     * 根据ID查询周报
     * @param id 周报ID
     * @return 周报信息
     */
    WeeklyReport getById(Integer id);
    
    /**
     * 根据成员ID查询周报列表
     * @param memberId 成员ID
     * @return 周报列表
     */
    List<WeeklyReport> getByMemberId(Integer memberId);
    
    /**
     * 根据成员ID查询周报及其内容（完整信息）
     * @param memberId 成员ID
     * @return 周报视图对象列表（包含内容列表）
     */
    List<WeeklyReportVO> getReportWithContentsByMemberId(Integer memberId);
    
    /**
     * 根据成员名称查询周报及其内容（完整信息）
     * @param memberName 成员名称
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByMemberName(String memberName);
    
    /**
     * 根据角色类型查询周报及其内容（完整信息）
     * @param roleType 角色类型（前端/后端）
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByRoleType(String roleType);

    /**
     * 根据周数查询周报及其内容（完整信息）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByWeekWithoutPagination(Integer reportWeek, Integer reportYear);

    /**
     * 根据周数分页查询周报及其内容（完整信息）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @param page 页码（从1开始）
     * @param pageSize 每页条数
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByWeekAndPage(Integer reportWeek, Integer reportYear, Integer page, Integer pageSize);

    /**
     * 分页查询周报及其内容（完整信息）
     * @param page 页码（从1开始）
     * @param pageSize 每页条数
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByPage(Integer page, Integer pageSize);
    
    /**
     * 根据角色类型分页查询周报及其内容（完整信息）
     * @param roleType 角色类型（前端/后端）
     * @param page 页码（从1开始）
     * @param pageSize 每页条数
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByRoleTypeAndPage(String roleType, Integer page, Integer pageSize);
    
    /**
     * 根据成员ID分页查询周报及其内容（完整信息）
     * @param memberId 成员ID
     * @param page 页码（从1开始）
     * @param pageSize 每页条数
     * @return 周报视图对象列表（包含内容列表和成员角色）
     */
    List<WeeklyReportVO> getReportWithContentsByMemberIdAndPage(Integer memberId, Integer page, Integer pageSize);
    
    /**
     * 根据周数和年份删除周报信息（包括关联的周报内容）
     * @param reportWeek 周数（1-52）
     * @param reportYear 年份
     * @return 删除的记录数
     */
    Integer deleteByWeekAndYear(Integer reportWeek, Integer reportYear);

    /**
     * 添加周报及其内容
     * @param weeklyReportDTO 周报信息
     * @param weeklyReportContentDTO 周报内容
     */
    void addWeeklyReportWithContent(Integer memberId, WeeklyReportDTO weeklyReportDTO, WeeklyReportContentDTO weeklyReportContentDTO);
}